package com.udi.project.business.local.di.service.Impl;

import com.udi.project.business.local.di.domain.NameCode;
import com.udi.project.business.local.di.mapper.DiGenerateMapper;
import com.udi.project.business.local.di.service.DiGenerateService;
import com.udi.project.business.local.di.thread.Endurance;
import com.udi.project.business.utils.generate.GenerateDi;
import com.udi.project.business.utils.httpApi.OkHttp1;
import com.udi.project.business.utils.redis.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


/**
 * @author Admin
 * DI持久化、申报、生成 业务类
 */
@Service
@Slf4j
public class DiGenerateServiceImpl implements DiGenerateService {

    /**DI生成工具*/
    @Autowired
    private GenerateDi generateDi;

    /** 厂商识别码*/
    @Autowired
    private DiGenerateMapper diGenerateMapper;

    /** redis工具*/
    @Autowired
    private RedisUtils redisUtils;

    /** 申报接口*/
    @Autowired
    private OkHttp1 okHttp1;


    /**
     持久化设计：【要求服务器配置内存需在4GB或以上】
        生成出来的DI首先保存到redis中，生成完毕将触发命令开启一个新的子线程，用来持久化
        需要对redis的数据做限制，如果此Kye保存数据已超过100万条【此时内存在1-1.5G的占用量】则直接开启子线程持久化，
     并同时将已持久化的数据在redis中做删除处理，缓解内存压力。
     包装标识符(1位)+厂商识别码(4位)【前三位690为国际单位(3位)】+商品项目码(2~5位)+校验码(1位)
     */
    @Override
    public int diGenerate(Integer corpCode,Integer packageCode, String deptId, Integer frequency) {
        //厂商码是否为空
        if(corpCode == 0 || corpCode == null){
            return 0;
        }
        //根据生成数量一次循环
        for(int i=0;i<frequency;i++){
            //开始生成码
            StringBuffer code = generateDi.GetDi(corpCode,packageCode);
            if(code.equals("500")){
                return 0;
            }
            redisUtils.lSet("diCode",code);
            redisUtils.set("deptId",deptId);
        }

        if(packageCode == 0){
            redisUtils.set("type","GTIN-13");
        }else if(packageCode > 0){
            redisUtils.set("type","GTIN-14 "+packageCode+"级");
        }
        //包装指示符
        redisUtils.set("pkgNum",packageCode);
        //开启子线程持久化DI
        Endurance endurance = new Endurance();
        endurance.start();

        return 1;

    }


    @Override
    public List<NameCode> dept() {
        return diGenerateMapper.dept();
    }


}
